#include <logbase.h>
// 指针+1
/*
指针+1，是调到下个元素内容的首地址。
假设数组&a==ａ==0.
char *a; 则：a + 1 == 1.
int a[2]; 则：a + 1 == 4.
结构体(结构体长度为20) *a; a + 1 == 20.
*/
#pragma pack(1) //
struct MyStruct
{
    union // 匿名联合体
    {
        struct // 匿名结构体
        {
            // 安位分配成员变量空间。
            uint32_t a : 3; // 占0、1、2位。
            uint32_t b : 4; // 占3、4、5、6位。
            uint32_t c : 5; // 占7、8、9、10、11
        };
        uint32_t value;
    };
};
// 主要用于一些协议之中，根据不同命令，使用不同结构体。
// 备注：这里没有考虑大小端。如果都是小端系统、都是大端系统，没有问题。
#pragma pack()
/*
二位数组：
首先将它看为看作以为数组，每个元素是一个数组．
int a[3][2]; 假设a被分配在地址0开始．首先将a[3]看作一个数组，每个元素是int[2]的数组．
因此有：&a==a==0,　每个原始是2个int的数组.因此也有a+1==8
#####################################################
对于每个成员a[0],a[1],a[2]也是数组．那么他们也符合数组的特征．
有&a[0]==a[0]==0,a[0]+1==4
有&a[1]==a[1]==8,a[1]+1==12
有&a[2]==a[2]==16,a[2]+1==20
*/
#define testLength 5
// 指针+1，是调到下个元素内容的首地址。
// char *p;p = 0;p += 1;因为char长度是1，p+1是1.
// int *p; p = 0; p++;因为int长度是4，p+1是4.
// 结构体指针+1，步长结构体长度。
// 二位数组，+1步长是一维数组长度10.
int main(int argc, char **argv)
{
    {
        struct MyStruct tempbuffer[testLength];
        struct MyStruct *tmppointer = tempbuffer;
        // tmppointer + 1，分别是tempbuffer[0]、tempbuffer[1]、tempbuffer[2]、的地址。
        for(int i = 0; i < testLength; i++)
        {
            logdebugc("%p", tmppointer);//每次实际+4.
            (tmppointer++)[0].value = i;
            // tmppointer[i] = i;
        }
        tmppointer = tempbuffer;
        for(int i = 0; i < testLength; i++, tmppointer++)
        {
            logdebugc("%u", tmppointer->value);
        }
    }

    {
        // 二维数组,+1步长是一维数组长度10.
        char tmp2array[2][10];
        logdebugc("%p", tmp2array);//0x00
        logdebugc("%p", tmp2array + 1);//0x0a
        logdebugc("%p", tmp2array[0]);//0x00
        logdebugc("%p", tmp2array[0] + 1);//0x01
    }

    return 1;
}

